package com.big.app.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.big.app.bo.PayzBo;
import com.big.app.dao.PayzDao;
import com.big.app.entity.Payz;
import com.big.app.service.intf.PayzService;
import com.big.app.util.AliPayUtils;
import com.big.app.util.StringUtils;
import com.big.app.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Random;


@Service
public class PayzServiceImpl implements PayzService {
    @Autowired
    private PayzDao dao;

    @Override
    public R createPay(PayzBo bo) {
        //1.验证参数
        if(bo!=null){
            //2.生成 订单号 长的
            String no=createNo(bo.getOid());
            //构建支付对象
            AliPayUtils.AliPay pay=new AliPayUtils.AliPay(no, bo.getMoney(), bo.getTitle());
            //发起支付
            String content= AliPayUtils.createPay(pay);
            if(StringUtils.isNoyEmpty(content)){
                //创建支付成功
                //存储到数据库
                Payz obj=new Payz(bo.getOid(), 1,bo.getMoney(),no);
                dao.insert(obj);
                //返回 - 支付宝生成的表单内容
                return new R(200,"ok",content);
            }
        }
        return new R(400,"fail",null);
    }



    @Override
    public R queryPay(int oid) {
        //1.验证参数
        if(oid>0){
            //2.查询数据库的额支付信息
            Payz payz=dao.selectOne(new QueryWrapper<Payz>().eq("oid",oid));
            //3.验证是否存在
            if(payz!=null){
                //4.如果支付信息为 未支付，那么需要请求第三方支付
                if(payz.getFlag()==1){
                    //5.请求支付宝 查询支付状态
                    String r=AliPayUtils.queryPay(payz.getNo());
                    if(StringUtils.isNoyEmpty(r)) {
                        switch (r) {
                            case "TRADE_CLOSED"://订单关闭
                                payz.setFlag(3);
                                break;
                            case "TRADE_SUCCESS"://交易成功
                                payz.setFlag(2);
                                break;
                            case "TRADE_FINISHED"://交易完成
                                payz.setFlag(4);
                                break;
                        }
                        //更新支付状态
                        dao.updateById(payz);
                    }
                }
                return new R(200,"ok",payz);
            }
        }
        return new R(400,"网络异常！",null);
    }

    @Override
    public R queryAll() {
        return new R(200,"ok",dao.selectList(null));
    }

    //生成订单号，不超过64位
    private String createNo(int oid){
        return System.currentTimeMillis()+"_"+oid+"_"+new Random().nextInt(1000);
    }
}
